home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / MOVE.C < prev    next >
C/C++ Source or Header  |  1980-01-10  |  6KB  |  143 lines

  1. #include <stdio.h>
  2. #include <dir.h>
  3. #include <string.h>
  4.  
  5. char    newpath[MAXPATH], pathname[MAXPATH],newname[MAXPATH], oldname[MAXPATH];
  6. char    drive[MAXDRIVE], subdir[MAXDIR], file[MAXFILE], ext[MAXEXT];
  7. char    helpname[MAXPATH], sourcename[MAXPATH];
  8.  
  9. struct ffblk dta;
  10.  
  11. int main(int argc,char *argv[])
  12. {
  13.     int len, done, count=0, wassubdir=1, loop, gavename=0, star=0;
  14.  
  15.     if(argc != 3){      /* Test for proper number of command line arguments */
  16.     printf("\nUsage:   move [path]file(s).ext path[file.ext]|file.ext");
  17.     printf("\n         The * and ? wild cards are permitted for moving.\n");
  18.     return(1);
  19.     }
  20.     strcpy(sourcename,argv[1]);
  21.     strcpy(newpath,argv[2]);    /* Save a copy of the destination path */
  22.     strcpy(subdir,argv[2]);     /* In this place too ! */
  23.     strcpy(helpname,argv[2]);   /* In this place too ! */
  24.     len = strlen(newpath);      /* Get destination path length */
  25.     if(newpath[len-1] == 92)    /* Did user supply a '\' on destination path */
  26.       {
  27.        wassubdir=0;             /* Destination was meant to be a directory */
  28.        if (len>1)               /* Make sure whether you move to root-directory */
  29.                 /* Was bug in previous release; */
  30.                 /* move to root was not possible */
  31.        subdir[len-1] = 0;       /* If '\' on destination path, */
  32.                 /* remove '\' from the secondary copy */
  33.       }
  34.       else                      /* If no, add one to primary copy */
  35.        {
  36.     newpath[len] = 92;      /* Add the '\' */
  37.     newpath[len+1] = 0;     /* Don't forget to terminate it */
  38.        }
  39.     getcwd(newname,MAXPATH);    /* Save the directory we were called from */
  40.  
  41.     /* The following block supposes that user wants to rename a file */
  42.     if(chdir(subdir) * wassubdir)   /* This block enables renaming across
  43.                     directories for single files.
  44.                     added by Stefan Timphus */
  45.        {
  46.         fnsplit(helpname,drive,subdir,file,ext); /* Break up the dest file name */
  47.         gavename=1;         /* Name for renaming was given */
  48.         newpath[len]=0;         /* Remove the '\' */
  49.         strcat(file,ext);
  50.         len=strlen(subdir);
  51.         subdir[len-1]=0;        /* here too */
  52.         wassubdir=0;            /* really wasn't but is asked later */
  53.         for (loop=0;sourcename[loop]!=0;loop++)
  54.         {
  55.             if ((sourcename[loop]=='*') || (sourcename[loop]=='?'))
  56.             star++;              /* check if you want to rename */
  57.         }            /* several files, which is impossible */
  58.         for (loop=0;file[loop]!=0;loop++)
  59.         {
  60.             if ((file[loop]=='*') || (file[loop]=='?'))
  61.             star++;              /* you want to rename a single */
  62.         }            /* file, so don't give '*' or '?' */
  63.                     /* in the destination name */
  64.         if (star)
  65.         {
  66.                  printf("? or * not allowed if file is to be renamed\n");
  67.             return 11;
  68.         }
  69.     }   /* End additional block*/
  70.    
  71.     /* This line is new for the second modification */
  72.     chdir(newname);
  73.  
  74.     if(chdir(subdir) * wassubdir)  /* See if the destination directory exists */
  75.       {
  76.        printf("Cannot change directory to %s ... quitting.",subdir);
  77.        return 1;
  78.       }
  79.     chdir(newname);                         /* Go back to home directory */
  80.     fnsplit(argv[1],drive,subdir,file,ext); /* Break up the source file name */
  81.     sprintf(pathname,"%s%s",drive,subdir);  /* Save path of source file(s) */
  82.     done = findfirst(argv[1],&dta,47);      /* Go look for first file */
  83. while(!done){
  84.     strcpy(oldname,pathname);      /* Start "creating" the old filename */
  85.     strcat(oldname,dta.ff_name);
  86.     strupr(oldname);               /* Make it all upper case for DOS */
  87.     strcpy(newname,newpath);   /* Start "creating" destination filename */
  88.     if (!gavename)             /* Real moving without rename */
  89.     {
  90.     strcat(newname,dta.ff_name);
  91.     }
  92.     strupr(newname);              /* Make it upper case too */
  93.     if(rename(oldname,newname)==0)    /* Try to rename the file */
  94.       {                              /* If successful, ... */
  95.     count++;                     /* Increment total files moved */
  96.     printf("%-15s moved to %s\n",oldname,newname);   /* Notify user */
  97.     done=findnext(&dta);         /* Look for next one */
  98.     continue;
  99.       }
  100. /* If we can't rename it, A) File already exists, or B) File has permissions */
  101.    printf("The file %s exists, do you want to overwite it (y/n) ",newname);
  102.    len = getche();      /* Get their keypress */
  103.    putchar('\n');
  104.    if(len=='y' || len=='Y')
  105.      {
  106.       if(_chmod(newname,1,0))        /* Set file permissions to r/w */
  107.          printf("Error changing mode of %s. %s not moved.\n",newname,oldname);
  108.         else
  109.           if(remove(newname))
  110.              printf("Error removing %s. %s not moved.\n",newname,oldname);
  111.             else
  112.              continue;           /* After removing file, re-attempt rename */
  113. /* If we can't change the mode or delete the file, forget it! */
  114.      }
  115.    done=findnext(&dta);           /* Find next file matching argv[1] */
  116. }                                  /* End of while */
  117.    if(count>0)                        /* Tell user how much work we did */
  118.       printf("\nNumber of files moved: %3d\n",count);
  119.     else
  120.       printf("No files match.\n");
  121. }
  122. /*  Program compiled using TURBO C VER-2.0
  123.     Written by Shawn Antol
  124.     AT&T Bell Labs
  125.     312-979-5622
  126.     att!ihlpb!santol
  127.     My employer and I are not accountable for any damages
  128.     resulting from the use of this program. It has been tested on
  129.     PC Compatibles using DOS 3.1 and DOS 3.2 and found to have no
  130.     no known bugs (I found one and removed it; Stefan Timphus).
  131.  
  132.     1989-04-11
  133.     Modified by Stefan Timphus, University Dortmund
  134.     +49 231 755-4663
  135.     To make it more UNIX-like.
  136.     Now can also be used for simple renaming and renaming
  137.     across directories, but only for single files.
  138.     Version for renaming multiple files should be possible.
  139.     Compiled using Turbo-C 2.0.
  140.     timphus@stltar.stl.informatik.uni-dortmund.de
  141.     simula@trillian.irb.informatik.uni-dortmund.de
  142. */
  143.